什么是Spring Cloud Config

Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持。使用Config Server,您可以在所有环境中管理应用程序的外部属性。客户端和服务器上的概念映射与Spring Environment和PropertySource抽象相同,因此它们与Spring应用程序非常契合,但可以与任何以任何语言运行的应用程序一起使用。随着应用程序通过从开发人员到测试和生产的部署流程,您可以管理这些环境之间的配置,并确定应用程序具有迁移时需要运行的一切。服务器存储后端的默认实现使用git,因此它轻松支持标签版本的配置环境,以及可以访问用于管理内容的各种工具。很容易添加替代实现,并使用Spring配置将其插入。

以上内容为官方直译

项目集成之配置中心

Config Server

1. pom.xml中添加Maven依赖

<parent>
    <!-- spring boot -->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <!-- netflix-eureka-client-->
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <!-- Spring Cloud Config Server -->
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <!-- spring cloud -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley RC1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

2. 添加注解支持

@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}

3. application.yml配置

spring:
  application:
    name: config-server
  cloud:
    config:
      enabled: true
      server:
        git:
          # git仓库地址
          uri: https://github.com/kevin-yang-work/SpringcloudConfig/
          # 配置仓库路径下的相对搜索位置,可以配置多个
          search-paths: respo
          username:
          password:
#        svn:
#          uri: http://svn.kevin.com/svn/repos/config-repos/
#          # 客户端来选择
##          default-label: trunk
#          username: kevin
#          password: kevin
#          search-paths: demo
      name: config-client
      # 仓库的分支,默认为master
      label: master

#  profiles:
#    # 如果使用subversion必须加
#    include: subversion

server:
  port: 8888

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
Git仓库信息根据实际情况进行填写
SVN仓库配置见注释内容,后续做详细说明
这里我们将配置服务中心注册到Eureka,实现配置服务中心的高可用

至此springCloud配置中心服务端配置完毕。

4. 运行概览

我们在远程仓库中添加一个config-client-dev.properties的文件,内容如下:

foo = foo version 3
其中config-client对应到客户端spring.cloud.config.name属性,dev对应到客户端spring.cloud.config.profile属性

启动程序,访问http://localhost:8888/config-...

{"name":"config-client","profiles":["dev"],"label":null,"version":"dd5e327223129b3d6d73a5e87b8cdf0a4031619c","state":null,"propertySources":[{"name":"https://github.com/kevin-yang-work/SpringcloudConfig//respo/config-client-dev.properties","source":{"foo":"foo version 3"}}]}
返回以上结果证明配置服务中心可从远程仓库获取到配置信息

HTTP具有以下格式的资源(作为客户端访问格式说明):

/{name}-{profiles}.properties
/{name}-{profiles}.yml
/{label}/{name}-{profiles}.properties
/{label}/{name}-{profiles}.json
/{name}-{profiles}.json
/{label}/{name}-{profiles}.yml
其中name作为spring.cloud.config.name注入,profiles作为激活的配置文件或者spring.cloud.config.name注入,label是可选的git标签(默认为master)

Config Client

1. pom.xml引入Maven依赖

<parent>
    <!-- spring boot -->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <!-- netflix-eureka-client-->
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <!-- Spring Cloud Config Client-->
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <!-- spring cloud -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley RC1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

2. application.yml配置

spring:
  application:
    name: config-client
  cloud:
    config:
      name: config-client
      label: master
      profile: dev
#      uri: http://localhost:8888/
      discovery:
        enabled: true
        service-id: config-server

server:
  port: 8882

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
这里我们将服务端和客户端都注册到服务注册中心(Eureka),那么可以通过discovery下的属性进行配置服务中心注册,如果不使用服务注册中心,指明spring.cloud.config.uri属性为配置服务中心地址即可

至此配置服务中心客户端配置完毕。

4. 运行概览

  • 添加REST接口,从配置中心读取foo属性。

    @SpringBootApplication
    @RestController
    public class ConfigClientApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ConfigClientApplication.class, args);
        }
    
        @Value("${foo}")
        String foo;
        @RequestMapping(value = "/hi")
        public String hi(){
            return foo;
        }
    }
  • 启动程序访问http://localhost:8881/hi,结果如下:

    foo version 3

广播远程应用配置文件的更新

上述实现客户端从配置中心读取配置文件中的属性,但是如果配置文件属性有变更,如何将更改应用到所有的客户端呢?这就是此节需要讲述的内容。我们通过Spring Cloud Bus实现通知配置文件的变更。

1. pom.xml引入Maven依赖

<dependency>
    <!-- 消息服务总线 通知微服务架构的配置文件的更改 -->
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <!-- 配置重试机制需要 -->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
    <!-- 配置重试机制需要 -->
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
</dependency>
消息服务总线需要actuator的支持,这里还加入了重试机制的依赖,如果不需要可以忽略

2. application.yml的变更

spring:
  rabbitmq:
    host: rabbitmq.kevin.com
    port: 5672
    username: rabbitmq
    password: rabbitmq
management:
  endpoints:
    web:
      base-path: /
      exposure:
        include: "*"
这里消息服务总线我们需要rabbitMq的支持,请自行配置rabbitMq环境
同样对于actuator,我们在这里暴露所有端口,如应用到生产,请谨慎选择,这里用到的endpointbus-refresh,用于配置文件的更新
注意:management.endpoints.web.base-path定义监控根路径,默认为:/actuator

3. 运行概览

启动一个eureka-server,一个confg-server,两个config-client,端口为:88818882

访问 http://localhost:8881/hi 浏览器显示:
(或访问 http://localhost:8882/hi

foo version 3

这时我们去代码仓库将foo的值改为“foo version 4”,即改变配置文件foo的值。如果是传统的做法,需要重启服务,才能达到配置文件的更新。此时,我们只需要发送post请求:http://localhost:8881/bus-refresh,你会发现config-client会重新读取配置文件

附加说明

  1. 本文参考资料

Blueye
24 声望2 粉丝

我创造,所以我生存。